
#ifndef	ZIG_X_STRING_HPP
#define	ZIG_X_STRING_HPP

#include	<string>
#include	<stdarg.h>
#include	<stdlib.h>

namespace	zig
{

	class	String
	{

	public	:
		static	std::string	format(const char* pszFormat, ...)
		{
			char	szBuf[1024];
			int		n, size  = sizeof(szBuf);
			char*	p = szBuf;
			va_list	args;

			do {
				va_start(args, pszFormat);
				n = vsnprintf(p, size - 1, pszFormat, args);
				va_end(args);

				if (n > -1 && n < size) {
					break;
				}

				if (n > -1) 		// glibc 2.1
					size = n + 1;	//    exactly what's need
				else				// glibc 2.0
					size *= 2;		//    double size and try again

				p = (char *)(p == szBuf ? malloc(size) : realloc(p, size));

				if (NULL == p) {
					throw std::bad_alloc();
				}
			} while(true);

			if (p == szBuf) {
				return	std::string(p, n);
			}

			std::string	result(p, n);
			free(p);
			return	result;
		}	// format()

	};	// class String
	
}	// namespace zig

#endif	// ZIG_X_STRING_HPP

